package com.dependent;

/***
 * 演示依赖传递的三种方式
 * 1 接口传递
 * 2 构造方法传递
 * 3 setter方法传递
 *
 * 场景： 拿遥控器去开电视，电视的种类很多，所以电视是接口
 */
public class DependentTransfer {
    public static void main(String[] args) {
        //todo:接口传递依赖，演示
        //ChangHong changHong = new ChangHong();
        //new OpenAndClose().open(changHong);

        //todo: 构造方法传递依赖，演示
        //ChangHong changHong = new ChangHong();
        //OpenAndClose openAndClose = new OpenAndClose(changHong);
        //openAndClose.open(); //这个是重载的方法


        //todo: setter方法传值，其实和构造方法传值类似，都是接口作为成员变量
        ChangHong changHong = new ChangHong();
        OpenAndClose openAndClose = new OpenAndClose();
        openAndClose.setItv(changHong);
        openAndClose.open();

    }
}


/** 1 接口传递 ：就是把一个接口作为入参*/
//遥控器，就是一个简单的接口，要求实现类要有open方法
/*
interface IOpenAndClose{
    public void open(ITV itv);
}
//电视机接口，目的在于让不同的电视机实现这个接口
interface ITV{
    public void play();
}
class ChangHong implements ITV{
    @Override
    public void play() {
        System.out.println("长虹电视机开机了！");
    }
}
class OpenAndClose implements IOpenAndClose{
    @Override
    public void open(ITV itv) {
        itv.play();
    }
}*/


/** 2 通过构造方法传递依赖 */
/*

interface IOpenAndClose{
    public void open(ITV itv);
}
//电视机接口，目的在于让不同的电视机实现这个接口
interface ITV{
    public void play();
}
class ChangHong implements ITV{

    @Override
    public void play() {
        System.out.println("长虹电视机开机啦！");
    }
}
class OpenAndClose implements IOpenAndClose{

    private ITV itv;

    public OpenAndClose(ITV itv){
        this.itv = itv;
    }

    @Override
    public void open(ITV itv) {

    }

    public void open(){
        this.itv.play();
    }
}
*/


/** 通过 setter方法传值 */
interface IOpenAndClose{
    public void open(ITV itv);
}
//电视机接口，目的在于让不同的电视机实现这个接口
interface ITV{
    public void play();
}
class ChangHong implements ITV{

    @Override
    public void play() {
        System.out.println("长虹电视机开机啦！");
    }
}
class OpenAndClose implements IOpenAndClose{

    private ITV itv;

    public void setItv(ITV itv) {
        this.itv = itv;
    }

    @Override
    public void open(ITV itv) {

    }

    public void open(){
        this.itv.play();
    }
}
